package com.qingzhou.common.security.config;

import cn.dev33.satoken.dao.SaTokenDao;
import cn.dev33.satoken.dao.SaTokenDaoRedissonJackson;
import com.qingzhou.common.core.constants.ServiceConstant;
import com.qingzhou.common.security.impl.AuthProcessorImpl;
import org.noear.solon.annotation.Bean;
import org.noear.solon.annotation.Condition;
import org.noear.solon.annotation.Configuration;
import org.noear.solon.auth.AuthAdapter;
import org.noear.solon.core.handle.Context;
import org.redisson.api.RedissonClient;

/**
 * 安全配置
 * @author xm
 */
@Configuration
public class SecurityConfig {

    /**
     * SaTokenDao
     * @param redissonClient
     * @return
     */
    @Bean
    @Condition(onClass = RedissonClient.class)
    public SaTokenDao saTokenDaoInit(RedissonClient redissonClient) {
        return new SaTokenDaoRedissonJackson(redissonClient);
    }

    /**
     * 鉴权处理（可以在每个模块定制合适的鉴权处理）
     * @return
     */
    @Bean
    @Condition(onMissingBean = AuthAdapter.class)
    public AuthAdapter authAdapter() {
        return new AuthAdapter()
                // 添加规则（除服务间调用的路径外，所有路径校验权限）
                .addRule(r -> r.include("/**").exclude(ServiceConstant.PATH_BASE + "/**").verifyPermissions())
                // 设定鉴权处理器
                .processor(new AuthProcessorImpl())
                // 设定默认的验证失败处理
                .failure(Context::render);
    }

}
